package thread;

// 懒汉模式实现的单例模式
class SingletonLazy {
    // 此处先把这个实例的引用设为 null, 先不着急创建实例.
    //通过 volatile,编译器就发现,Instance是易失的,围绕这个变量的优化,就会非常克制
    //不仅仅在读取变量的优化上克制,也会在修改变量的优化上克制
    private static volatile SingletonLazy instance = null;
    private static Object locker = new Object();

    public static SingletonLazy getInstance() {
        //第一个if:在这个条件中判定当前是否应该要加锁.
        //不加if性能会拖慢很多
        if (instance == null) {
            //防止线程不安全,通过锁把if和new打包成一个整体,if和new操作就是一个原子
            synchronized (locker) {
                //第二个if:是否要创建对象
                if (instance == null) {
                    instance = new SingletonLazy();
                }
            }
        }
        return instance;
    }

    private SingletonLazy() { }
}

public class Demo27 {
    public static void main(String[] args) {
        SingletonLazy s1 = SingletonLazy.getInstance();
        SingletonLazy s2 = SingletonLazy.getInstance();
        System.out.println(s1 == s2);
    }
}
